/** 
 * @main Plik naglowkowy klasy obiektu dyskretnego typu ARMAX.
 * @file    armax.h
 * @author  Grzegorz Sejnota
 *
 * @created on 23 grudzien 2008, 16:47
 * @version 0.0001
 */



#ifndef _ARMAX_H
#define	_ARMAX_H

#include "wielomian.h"
#include "dyskretny.h"
#include "losowy.h"
#include <string>
#include <iosfwd>
#include <vector>

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ POCZĄTEK [klasy ObiektARMAX] ++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
 * Klasa odzwierciedlajaca dyskretny obiekt typu ARMAX. Obiekt ARMAX sklada sie
 * z trzech wielomianow:
 *      - wielomian A o stopniu dA:
 *          A(z^-1) =  1 + a1*z^-1 + ... + adA*z^-dA
 *      - wielomian B o stopniu dB:
 *          B(z^-1) =  b0 + b1*z^-1 + ... + bdB*z^-dB
 *      - wielomian C o stopniu dC:
 *          C(z^-1) =  c0 + c1*z^-1 + ... + cdC*z^-dC
 *
 * Obiekt typu ARMAX jest zdefiniowany następująco:
 *      y = z^-k * B(z^-1)/A(z^-1)* u + C(z^-1)/A(z^-1)* e
 *
 * Klasa pozwala zamodelować nieliniowość obiektu, a także jego niestacjonarnosc.
 * Nieliniowość jestX nieliniowością typu nasycenie - wyjście z obiektu posiada
 * górne i dolne ograniczenie. Niestacjonarnosc pozwala na podanie dwóch zestawow 
 * parametrow obiektu i dwoch dyskretnych chwil czasu 
 * (czasNiestacjonarnosci1 i czasNiestacjonarnosci2), 
 * gdy czasDyskretny<czasNiestacjonarnosci1 to symulacja odbywa się na pierwszym
 * zestawie parametrow, gdy czasNie1<czasDyskretny<czasNie2 następuje liniowe
 * przejście pomiędzy parametrami, natomiast dla czasDyskretny<czasNie2 symulacja
 * odbywa się w opraciu o drugi zestaw parametrów.
 *      
 */
class ObiektARMAX : public ObiektDyskretny{
private:
    ///wielomian A - mianownik transmitancji dyskretnej
    Wielomian wielomianA, 
    ///wielomian B - licznik transmitancji dyskretnej
              wielomianB,
    ///wielomian C - licznik transmitancji toru zakłóceń
              wielomianC,
    ///wielomian A1 - pierwszy zestaw parametrow
              wielomianA1,
    ///wielomian B1 - pierwszy zestaw parametrow
              wielomianB1,
    ///wielomian C1 - pierwszy zestaw parametrow
              wielomianC1,
    ///wielomian A2 - drugi zestaw parametrow
              wielomianA2,
    ///wielomian B2 - drugi zestaw parametrow
              wielomianB2,
    ///wielomian C2 - drugi zestaw parametrow
              wielomianC2;
    
    ///opoznienie dyskretne obiektu
    int k, 
    ///stopien wielomianu A
        stopienA,   
    ///stopien wielomianu B
        stopienB,
    ///stopien wielomianu C
        stopienC;
    
    ///nazwa obiektu
    std::string nazwaObiektu;
    
    ///dyskretny czas
    int czasDyskretny,
    ///czas niestacjonarnosci 1 - poczatek niestacjonarnosci
        czasNie1,
    ///czas niestacjonarnosci 2 - koniec zmian w obiekcie
        czasNie2;
    
        
    
    ///maksymalna wartosc nasycenia wyjscia
    double yMax,
    ///minimalna wartosc nasycenia wyjscia       
           yMin,
    ///wariancja szumu
           warSzumu,
    ///współczynnik przeskalowania ciaguLosowego obiektu GenLosowy
           wspPrzeskalowania;
    
    ///flaga oznaczajaca stabilnosc
    bool jestStabilny,
    ///flaga oznaczajaca niestacjonarnosc
         jestNiestacjonarny;

    ///pamiec przeszlych wejsc obiektu
    std::vector<double> pamiecU,
    ///pamiec przeszlych wyjsc obiektu
                   pamiecY,
    ///pamiec przeszlych zaklocen
                   pamiecE;

    ///wektor przyrostow wspolczynnikow wielomianu A
    std::vector<double> przyrostA,
    ///wektor przyrostow wspolczynnikow wielomianu B
                   przyrostB,
    ///wektor przyrostow wspolczynnikow wielomianu C
                   przyrostC;
    
    void inicjalizuj();

	/// statyczny wzorzec mapy konfiguracji
	static std::vector< std::string > kluczeMapy;
	
	static std::vector<std::string> inicjalizujKlucze();        
    
public:
	/// zmienna statyczna przechowujaca liczbe obiektow
    static int liczbaObiektowARMAX;
    
    /* bezargumentowy konstruktor obiektu klasy ObiektARMAX*/
    ObiektARMAX();
    
    /* konstruktor kopiujący*/
    ObiektARMAX (const ObiektARMAX &wzor);
    
    /* konstruktor tworzacy obiekt ARMAX z podanych wektorow wspolczynnikow */
    ObiektARMAX (std::vector<double>, std::vector<double>, std::vector<double>, int);
    
    /* konstruktor tworzacy obiekt ARMAX z nasyceniem z podanych wektorow wspolczynnikow */
    ObiektARMAX (std::vector<double>, std::vector<double>, std::vector<double>, int, double, double);
    
    /* konstruktor tworzacy obiekt ARMAX z nasyceniem i niestacjonarnoscia */
    ObiektARMAX (std::vector<double> wA, std::vector<double> wB, std::vector<double> wC,
                 std::vector<double> wA2, std::vector<double> wB2, std::vector<double> wC2,
                 int k, int czasNie1, int czasNie2, double yMax, double yMin, double warSzumu);
    
    /* konstruktor tworzacy obiekt ARMAX z nasyceniem i niestacjonarnoscia */
    ObiektARMAX (std::vector<double> wA, std::vector<double> wB, std::vector<double> wC,
                 std::vector<double> wA2, std::vector<double> wB2, std::vector<double> wC2,
                 int k, int czasNie1, int czasNie2, double yMax, double yMin, 
                 double warSzumu, std::string nazwaObiektu);
    
    /* destruktor obiektu klasy ObiektARMAX*/
    ~ObiektARMAX();
    
    /* funkcja przeładowanego operatora przypisania = .*/
    ObiektARMAX& operator=(const ObiektARMAX &wzor );
    
    /* przeslonieniecie funkcji wirtualnej symulujacej obiekt w trybie online */
    double symuluj(double);

	/* zmierzenie wyjscia obiektu */
    double zmierzWyjscie();
    
    /* przeslonieniecie funkcji wirtualnej symulujacej obiekt w trybie offline */
    std::vector<double> symuluj(const std::vector<double> &);
    
    /* sprawdzanie stabilnosci obiektu */
    bool sprawdzStabilnosc() const;
    
    /* wyzerowanie pamieci obiektu */
    void zerujPamiec();
    
    /* przeslonieniecie funkcji wirtualnej wypisujacej informacje o obiekcie */
    void wypiszInfo() const;  
    
    /* wypisanie biezacych parametrow obiektu */
    void wypiszObecneParametry() const;
    
    /* pobranie nazwy obiektu */
    std::string pobierzNazwe() const;

	/* ustawienie parametrow z mapy */
	bool ustawParametry ( std::map<std::string, std::string> );

	/* pobieranie mapy parametrow */
	std::map<std::string, std::string> pobierzParametry () const;
};
//------------------------------------------------------------------------------
//-------------- KONIEC [klasa ObiektARMAX] ------------------------------------
//------------------------------------------------------------------------------

#endif	/* _ARMAX_H */

